package com.ceair.authorization.wechat;

import org.springframework.http.HttpMethod;
import org.springframework.http.RequestEntity;
import org.springframework.security.oauth2.client.registration.ClientRegistration;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequestEntityConverter;
import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
import org.springframework.web.util.UriComponentsBuilder;

import java.net.URI;

import static com.ceair.constant.SecurityConstants.THIRD_LOGIN_WECHAT;
import static com.ceair.constant.SecurityConstants.WECHAT_PARAMETER_OPENID;

/**
 * @author wangbaohai
 * @ClassName WechatUserRequestEntityConverter
 * @description: 微信登录获取用户信息参数转换器
 * @date 2024年11月28日
 * @version: 1.0.0
 */
public class WechatUserRequestEntityConverter extends OAuth2UserRequestEntityConverter {

    /**
     * 重写convert方法以自定义OAuth2用户请求的转换
     * 此方法根据用户请求中的客户端信息，可能返回一个特定的RequestEntity对象
     * 主要用于在请求用户信息时，针对不同的客户端添加特定的请求参数
     *
     * @param userRequest OAuth2用户请求对象，包含客户端注册信息和访问令牌等
     * @return 返回一个RequestEntity对象，用于发起用户信息请求
     */
    @Override
    public RequestEntity<?> convert(OAuth2UserRequest userRequest) {
        // 获取配置文件中的客户端信息
        ClientRegistration clientRegistration = userRequest.getClientRegistration();
        // 判断客户端是否为微信登录
        if (THIRD_LOGIN_WECHAT.equals(clientRegistration.getRegistrationId())) {
            // 对于微信登录的特殊处理，请求用户信息时添加openid与access_token参数
            Object openid = userRequest.getAdditionalParameters().get(WECHAT_PARAMETER_OPENID);
            // 构建微信用户信息请求的URI
            URI uri = UriComponentsBuilder
                    .fromUriString(clientRegistration.getProviderDetails().getUserInfoEndpoint().getUri())
                    .queryParam(WECHAT_PARAMETER_OPENID, openid)
                    .queryParam(OAuth2ParameterNames.ACCESS_TOKEN, userRequest.getAccessToken().getTokenValue())
                    .build().toUri();
            // 返回定制的RequestEntity对象
            return new RequestEntity<>(HttpMethod.GET, uri);
        }
        // 对于非微信登录，调用父类方法进行处理
        return super.convert(userRequest);
    }

}
